/*
 * Copyright (c) 2012 Andrea De Rinaldis <ozioso at ipignoli.dyndns.org>
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

package org.dyndns.ipignoli.droidcruise.position;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Locale;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.dyndns.ipignoli.droidcruise.xml.GeocodeHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;


public class MyGeocoder{
  private final static String URI_STRING = "http://maps.google.com/maps/geo";

  private HttpClient          client;

  public MyGeocoder(){
    client = new DefaultHttpClient();
  }

  public String getFromLocation(MyLocation location)
      throws ClientProtocolException, IOException, URISyntaxException, SAXException, ParserConfigurationException{
    return getFromLocation(location.getLatitude(), location.getLongitude());
  }

  public String getFromLocation(double latitude, double longitude)
      throws ClientProtocolException, IOException, URISyntaxException,
      SAXException, ParserConfigurationException{
    HttpResponse response =
        client.execute(new HttpGet(new URI(new StringBuffer(URI_STRING)
            .append("?").append("q=").append(latitude).append(",")
            .append(longitude).append("&").append("hl=")
            .append(Locale.getDefault().getLanguage()).append("&")
            .append("output=").append("xml").toString())));
    if(response.getStatusLine().getStatusCode() != 200)
      throw new IOException(response.getStatusLine().getReasonPhrase());
    GeocodeHandler geocode = new GeocodeHandler();
    XMLReader parser =
        SAXParserFactory.newInstance().newSAXParser().getXMLReader();
    parser.setContentHandler(geocode);
    parser.parse(new InputSource(response.getEntity().getContent()));
    return geocode.getLocality();
  }
}
